#include<bits/stdc++.h>
using namespace std;
#define int long long
const int inf=1e9+1;
int T,ans;
int n,m,L,V;
struct node{
    int d,v,a;
    int l,r;
    bool flg;
}t[100050];
int p[100050];
bool cmp(node aa,node bb){
    if(aa.l!=bb.l)return aa.l<bb.l;
    else return aa.r<bb.r;
}
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >Q;
signed main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    ios::sync_with_stdio(0);
    cin>>T;
    while(T--){
        ans=0;
        for(int i=1;i<=100000;i++)t[i].flg=0;
        cin>>n>>m>>L>>V;
        for(int i=1;i<=n;i++){
            int X=0;
            cin>>t[i].d>>t[i].v>>t[i].a;
            if(t[i].a>0){
                if(t[i].v>V){
                    t[i].l=t[i].d;
                    t[i].r=L;
                }else{
                    X=(V*V-t[i].v*t[i].v)/(2*t[i].a);
                    X+=t[i].d;
                    X++;
                    if(X<=L){
                        t[i].l=X;
                        t[i].r=L;
                    }else{
                        t[i].l=inf;
                        t[i].r=inf;
                    }
                }

            }
            if(t[i].a==0){
                if(t[i].v>V){
                    t[i].l=t[i].d;
                    t[i].r=L;
                }else{
                    t[i].l=inf;
                    t[i].r=inf;
                }
            }
            if(t[i].a<0){
                if(t[i].v>V){
                    t[i].l=t[i].d;
                    X=(t[i].v*t[i].v-V*V)/(-2*t[i].a);
                    if((t[i].v*t[i].v-V*V)%(-2*t[i].a)==0)X--;
                    X+=t[i].d;
                    if(X>L)t[i].r=L;
                    else t[i].r=X;
                }else {
                    t[i].l=inf;
                    t[i].r=inf;
                }
            }

        }
        for(int i=1;i<=m;i++)cin>>p[i];
        sort(p+1,p+m+1);
        sort(t+1,t+n+1,cmp);
        int cnt=1;
        while(Q.size())Q.pop();
        for(int i=1;i<=m;i++){
            while(cnt<=n&&t[cnt].l<=p[i]){
                Q.push(make_pair(t[cnt].r,cnt));
                cnt++;
            }
            while(Q.size()&&Q.top().first<p[i])Q.pop();
            while(Q.size()){
                int tt=Q.top().second;
                tt[t].flg=1;
                Q.pop();
                ans++;
            }
        }

        cout<<ans<<' ';
        cnt=1;
        ans=m;
        for(int i=1;i<=m;i++){
            while(cnt<=n&&t[cnt].l<=p[i]){
                if(t[cnt].flg==1){
                    Q.push(make_pair(t[cnt].r,cnt));

                }cnt++;
            }
            if((!Q.size())||(i+1<=m&&p[i+1]<=Q.top().first))continue;
            else{
                ans--;
                while(Q.size())Q.pop();
            }
        }
        cout<<ans<<endl;
    }

return 0;
}
